﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Data.Common;
using System.Collections;
using Common.DbHelper.HelperException;

namespace Common.DbHelper
{
    /// <summary>
    /// 作者：赵虎
    /// 时间：2010-1-30日
    /// 功能：数据库访问工厂接口
    public interface IHelp
    {
        /// <summary>
        /// 当前适配器
        /// </summary>
        DbDataAdapter Adapter { get; set; }

        /// <summary>
        /// 当前命令对像
        /// </summary>
        DbCommand Command { get; set; }

        /// <summary>
        /// 当前连接
        /// </summary>
        DbConnection Connection { get; set; }

        /// <summary>
        /// 连接字符串
        /// </summary>
        string ConnectionString { get; }

        /// <summary>
        /// 执行Text类型 无参数 命令并返回行数
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>受影响行数</returns>
        int ExecuteCommand(string cmd);

        /// <summary>
        /// 测试连接
        /// </summary>
        /// <returns>连接是否可用</returns>
        bool ConnectionTest();

        /// <summary>
        /// 执行命令并返回行数.如果失败程序自动回滚
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>受影响行数</returns>
        int ExecuteCommand(string cmd, CommandType type, params DbParameter[] parameter);

        /// <summary>
        /// 执行Text类型命令并返回行数.如果失败程序自动回滚
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>受影响行数</returns>
        int ExecuteCommand(string cmd, params DbParameter[] parameter);

        /// <summary>
        /// 不加事务执行命令并返回行数.如果失败程序自动回滚
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>受影响行数</returns>
        int ExecuteNoTransactionCommand
            (string cmd, CommandType type, params DbParameter[] parameter);

        /// <summary>
        /// 执行返回第一行第一列的数据.如果失败程序自动回滚
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>第一行第一列数据</returns>
        object ExecuteScalar
            (string cmd, CommandType type, params DbParameter[] parameter);

        /// <summary>
        /// 执行返回第一行第一列的数据 命令语句为Text
        /// </summary>
        /// <param name="parameter">命令参数</param>
        /// <returns>第一行第一列数据</returns>
        object ExecuteScalar(string cmd, params DbParameter[] parameter);

        /// <summary>
        /// 执行返回第一行第一列的数据 命令语句为Text 无参数
        /// </summary>
        /// <returns>第一行第一列数据</returns>
        object ExecuteScalar(string cmd);

        /// <summary>
        /// 执行返回第一行第一列的数据 命令类型为Text 无参数
        /// </summary>
        /// <typeparam name="T">可以从DB类型转换成基本数据类型的类型如int</typeparam>
        /// <returns>第一行第一列的数据</returns>
        T ExecuteScalar<T>(string cmd) where T : struct;

        /// <summary>
        /// 执行返回第一行第一列的数据 命令类型为Text
        /// </summary>
        /// <typeparam name="T">可以从DB类型转换成基本数据类型的类型如int</typeparam>
        /// <param name="parameter">命令参数</param>
        /// <returns>第一行第一列的数据</returns>
        T ExecuteScalar<T>(string cmd, params DbParameter[] parameter) where T : struct;

        /// <summary>
        /// 执行返回第一行第一列的数据.如果失败程序自动回滚
        /// </summary>
        /// <typeparam name="T">可以从DB类型转换成基本数据类型的类型如int</typeparam>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>第一行第一列的数据</returns>
        T ExecuteScalar<T>(string cmd, CommandType type, params DbParameter[] parameter)
            where T : struct;



        /// <summary>
        /// 利用适配器填充DataTable,Text命令
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="parameter">命令参数</param>
        /// <param name="eh">错误处理</param>
        /// <returns>DataTable</returns>
        DataTable FillDataTable
            (string cmd, ExceptionHandler eh, params DbParameter[] parameter);

        /// <summary>
        /// 利用适配器填充DataTable
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <param name="eh">错误处理</param>
        /// <returns>DataTable</returns>
        DataTable FillDataTable
            (string cmd, CommandType type, ExceptionHandler eh, params DbParameter[] parameter);

        /// <summary>
        /// 利用适配器填充DataTable,Text命令,无错误处理,无命令参数
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <returns>DataTable</returns>
        DataTable FillDataTable(string cmd);

        /// <summary>
        /// 利用适配器填充DataTable,Text命令,无错误处理
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>DataTable</returns>
        DataTable FillDataTable(string cmd, params DbParameter[] parameter);

        /// <summary>
        /// 实体映射数据实体,命令类型Text,系统自动处理异常
        /// </summary>
        /// <typeparam name="T">欲映射的数据实体</typeparam>
        /// <param name="cmd">命令语句</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体集合</returns>
        List<T> FillEntityList<T>(string cmd, params DbParameter[] parameter) where T : class, new();

        /// <summary>
        /// 实体映射数据实体,命令类型Text,系统自动处理异常,无参数
        /// </summary>
        /// <typeparam name="T">欲映射的数据实体</typeparam>
        /// <param name="cmd">命令语句</param>
        /// <returns>实体集合</returns>
        List<T> FillEntityList<T>(string cmd) where T : class, new();

        /// <summary>
        /// 实体映射数据实体,命令类型Text
        /// </summary>
        /// <typeparam name="T">欲映射的数据实体</typeparam>
        /// <param name="cmd">命令语句</param>
        /// <param name="eh">当发生异常时要处理的方法 调用这个方法时先调用OnException</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体集合</returns>
        List<T> FillEntityList<T>
            (string cmd, ExceptionHandler eh, params DbParameter[] parameter) where T : class, new();

        /// <summary>
        /// 实体映射数据实体
        /// </summary>
        /// <typeparam name="T">欲映射的数据实体</typeparam>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="eh">当发生异常时要处理的方法 调用这个方法时先调用OnException</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体集合</returns>
        List<T> FillEntityList<T>
            (string cmd, CommandType type, ExceptionHandler eh, params DbParameter[] parameter)
            where T : class, new();

        /// <summary>
        /// 实体映射数据实体
        /// </summary>
        /// <typeparam name="T">欲映射的数据实体</typeparam>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体</returns>
        T FindByEntity<T>(string cmd, CommandType type, params DbParameter[] parameter)
            where T : class, new();

        /// <summary>
        /// 实体映射数据实体,命令类型Text
        /// </summary>
        /// <typeparam name="T">欲映射的数据实体</typeparam>
        /// <param name="cmd">命令语句</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体</returns>
        T FindByEntity<T>(string cmd, params DbParameter[] parameter)
            where T : class, new();

        /// <summary>
        /// 获取数据库阅读器.Text类型,无参数
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <returns>数据库阅读器 注意关闭阅读器对像</returns>
        DbDataReader GetDbDataReader(string cmd);

        /// <summary>
        /// 获数据库阅读器.Text命令
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>数据库阅读器 注意关闭阅读器对像</returns>
        DbDataReader GetDbDataReader(string cmd, params DbParameter[] parameter);

        /// <summary>
        /// 获取数据库阅读器
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>数据库阅读器。注意关闭阅读器对像</returns>
        DbDataReader GetDbDataReader(string cmd, CommandType type, params DbParameter[] parameter);

        /// <summary>
        /// 保存数据并返回当前行.命令类型为Text
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>当前主键</returns>
        long SaveData(string cmd, params DbParameter[] parameter);

        /// <summary>
        /// 保存数据并返回当前行
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>当前主键</returns>
        long SaveData(string cmd, CommandType type, params DbParameter[] parameter);

        /// <summary>
        /// Hashtable映射数据实体
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="eh">当发生异常时要处理的方法 调用这个方法时先调用OnException</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体Hashtable集合</returns>
        List<Hashtable> FillHashtableList(string cmd, CommandType type, ExceptionHandler eh, params DbParameter[] parameter);

        /// <summary>
        /// Hashtable映射数据实体 Text命令类型
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体Hashtable集合</returns>
        List<Hashtable> FillHashtableList(string cmd, params DbParameter[] parameter);

        /// <summary>
        /// Hashtable映射数据实体
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="type">命令类型</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体Hashtable集合</returns>
        Hashtable FindHashtable(string cmd, CommandType type, params DbParameter[] parameter);

        /// <summary>
        /// Hashtable映射数据实体 Text命令类型
        /// </summary>
        /// <param name="cmd">命令语句</param>
        /// <param name="parameter">命令参数</param>
        /// <returns>实体Hashtable集合</returns>
        Hashtable FindHashtable(string cmd, params DbParameter[] parameter);
    }
}
